10  REM  ************************
15  REM 
20  REM  ADDRESS BOOK
30  REM  
40  REM  - BY MICHAEL O'MALLEY
50  REM  A GRADE 12 "FUN" PROJECT
60  REM  ************************
100  REM 
110  D$ =  CHR$ (4) : REM  CTRL-D
115  W = 300 : REM  300 NAMES / ADDRESSES !
120  DIM A$(300,4) : REM  300 NAMES / ADDRESSES !
125  L = 0 : REM  NUMBER OF NAMES / ADDRESSES CURRENTLY IN THE ARRAY
130  SL = 0 : REM  THE PRINTER IS CURRENTLY OFF
135  P$ = "OFF"
190  GOSUB 8000 : REM  LOAD NAME / ADDRESS DATA

200  REM  
201  REM  ************************
202  REM    MAIN MENU        
203  REM  ************************
205  TEXT : HOME 
210  PRINT "======================================="
215  PRINT "           ADDRESS BOOK"
220  PRINT "         BY MICHAEL O'MALLEY"
225  PRINT "======================================="
230  PRINT " "; L; " NAMES/ADDRESSES (MAX = "; W; ")"
235  PRINT "          PRINTER IS "; : INVERSE : PRINT P$ : NORMAL 
240  PRINT : PRINT " WHAT DO YOU REQUIRE ?? ->  "
245  PRINT : PRINT "  1. ENTER A NEW NAME/ADDRESS"
250  PRINT : PRINT "  2. LOOK UP SOMEBODY"
255  PRINT : PRINT "  3. LOOK AT ENTIRE LIST OF NAMES"
260  PRINT : PRINT "  4. TURN PRINTER ON / OFF"
265  PRINT : PRINT "  5. DELETE A NAME / ADDRESS"
270  PRINT : PRINT "  6. DELETE ALL NAMES / ADDRESSES"
275  PRINT : PRINT "  7. EXIT PROGRAM"
280  PRINT : PRINT " WHICH    ?? ->  "; : GET B
285  IF B < 1 OR B > 7 THEN  GOTO 200 : REM  DISPLAY THE MENU AGAIN
290  ON B GOSUB 300,400,500,600,700,900,9000
295  GOTO 200 : REM  DISPLAY THE MENU AGAIN

300  REM 
301  REM  ***********************
302  REM  ENTER NEW NAME /ADDRESS
303  REM  ***********************
310  TEXT : HOME 
315  PRINT : PRINT : PRINT 
320  L = L + 1
325  PRINT " (USE NO COMMAS,COLONS OR FULL STOPS)"
330  PRINT : PRINT : PRINT "ENTRY No. = "; L; " / "; W
335  PRINT : PRINT 
340  REM  NAME CANNOT BE BLANK - BUT OTHER FIELDS CAN BE BLANK
345  PRINT : INPUT " ENTER NAME      -> "; A$(L,1)
350  IF A$(L,1) = "" THEN  PRINT : PRINT " **ERROR : NAME CANNOT BE BLANK !" : GOTO 340
355  PRINT : INPUT " ENTER ADDRESS   -> "; A$(L,2)
360  PRINT : INPUT " ENTER PHONE NO. -> "; A$(L,3)
365  PRINT : INPUT " ENTER BIRTHDAY  -> "; A$(L,4)
370  PRINT : PRINT : PRINT 
375  PRINT : PRINT "ADD MORE NAMES / ADDRESSES (Y/N)"; : GET F$
380  IF F$ = "Y" THEN 300
399  RETURN 

400  REM 
401  REM  ***********************
402  REM  LOOK UP SOMEBODY
403  REM  ***********************
404  PR# SL : REM   PRINTER ON/OFF
405  TEXT : HOME : PRINT : PRINT 
410  PRINT "WHAT NAME SHALL I LOOK UP FOR YOU..." : INPUT V$
415  PRINT : PRINT 
420  M = 0 : REM  NUMBER OF MATCHES
422  PRINT "======================================="
425  REM  SEARCH ENTIRE ARRAY FOR A MATCHING NAME
430  FOR I = 1 TO L
440  IF A$(I,1) = V$ THEN M = M + 1 : GOSUB 7000 : REM  DISPLAY CURRENT NAME / ADDRESS
450  NEXT I
460  IF M = 0 THEN  PRINT "  NO MATCHES FOUND ... SORRY !"
485  PR# 0 : REM   PRINTER OFF
490  PRINT : PRINT 
495  PRINT : PRINT " HIT ANY KEY..."; : GET Z$
499  RETURN 

500  REM 
501  REM  ***********************
502  REM  LOOK AT ENTIRE LIST
503  REM  ***********************
505  TEXT : HOME 
510  PR# SL : REM   PRINTER ON/OFF
515  PRINT : PRINT 
520  REM  DISPLAY ENTIRE ARRAY
522  PRINT "======================================="
525  LC = 0 : REM  LINE COUNT
530  FOR I = 1 TO L
540  GOSUB 7000 : REM  DISPLAY CURRENT NAME / ADDRESS
550  LC = LC + 1
560  IF LC = 3 THEN LC = 0 : PRINT : PRINT " HIT ANY KEY..."; : GET Z$ : TEXT : HOME : PRINT : PRINT "======================================="
570  NEXT I
585  PR# 0 : REM   PRINTER OFF
590  PRINT : PRINT 
595  PRINT : PRINT " HIT ANY KEY..."; : GET Z$
599  RETURN 

600  REM 
601  REM  *************************
602  REM   TURN PRINTER ON / OFF
603  REM  *************************
610  REM  THE VALUE OF SL IS USED TO CONTROL THE PRINTER VIA 
620  IF P$ = "OFF" THEN P$ = "ON" : SL = 1
630  IF P$ = "ON" THEN P$ = "OFF" : SL = 0
699  RETURN 

700  REM 
701  REM  ***********************
702  REM  DELETE A NAME / ADDRESS
703  REM  ***********************
705  TEXT : HOME : PRINT : PRINT 
710  PRINT " DELETE DATA FOR WHAT NAME " : INPUT V$
712  IF V$ = "" THEN  GOTO 799 : REM  EXIT BACK TO MENU
715  PRINT : PRINT 
720  PRINT "  ARE YOU SURE (Y/N)  "; : GET L$
725  IF L$ <  > "Y" THEN  GOTO 799 : REM  EXIT BACK TO MENU
730  M = 0 : REM  NUMBER OF MATCHES
735  REM  SEARCH ENTIRE ARRAY FOR A MATCHING NAME
740  FOR I = 1 TO L
745  IF A$(I,1) = V$ THEN M = M + 1 : GOSUB 800 : REM  SHUFFLE DOWN DATA
750  NEXT I
753  PRINT : PRINT 
755  IF M = 0 THEN  PRINT "  NO MATCHES FOUND ... SORRY !"
760  IF M > 0 THEN  PRINT " "; M; " MATCHING RECORDS DELETED !"
790  PRINT : PRINT 
795  PRINT : PRINT " HIT ANY KEY..."; : GET Z$
799  RETURN 

800  REM 
801  REM  **********************
802  REM  SHUFFLE DOWN DATA IN 
803  REM  ARRAY TO REMOVE THE 
804  REM  MATCHING RECORD
805  REM  **********************
810  L = L - 1 : REM  REDUCE THE NUMBER OF PEOPLE IN THE ARRAY
815  FOR R = I TO L
820  A$(I,1) = A$(I + 1,1)
825  A$(I,2) = A$(I + 1,2)
830  A$(I,3) = A$(I + 1,3)
835  A$(I,4) = A$(I + 1,4)
840  NEXT R
899  RETURN 

900  REM 
901  REM  *************************
902  REM  DELETE ALL NAMES / ADDRESSES
903  REM  *************************
904  TEXT : HOME : PRINT : PRINT : PRINT 
905  PRINT "  WARNING !! THIS WILL DESTROY ALL"
910  PRINT : PRINT "  "; L; " NAMES AND ADDRESSES STORED IN THE FILE."
915  PRINT : PRINT 
920  PRINT "  ARE YOU SURE (Y/N)  "; : GET L$
925  IF L$ <  > "Y" THEN  GOTO 999 : REM  EXIT BACK TO MENU
930  PRINT : PRINT : PRINT 
932  ONERR  GOTO 999 : REM  EXIT BACK TO MENU
935  PRINT " DELETING ADDRESS.DATA ... "
940  PRINT D$; "DELETE ADDRESS.DATA"
942  REM  NOW WRITE A ZERO TO THE FILE
944  REM  ERASE DATA FILE
945  PRINT D$; "OPEN ADDRESS.DATA"
950  PRINT D$; "WRITE ADDRESS.DATA"
955  PRINT 0
960  PRINT D$; "CLOSE ADDRESS.DATA"
970  REM  ERASE ALL DATA IN THE ARRAY
975  FOR I = 1 TO L
980  FOR J = 1 TO 4
985  A$(I,J) = ""
990  NEXT J
995  NEXT I
1000  PRINT : PRINT 
1010  PRINT " "; L; " NAMES AND ADDRESSES ERASED !"
1020  REM  SET THE NUMBER OF RECORDS IN THE ARRAY TO 0
1030  L = 0
1099  RETURN 

7000  REM 
7001  REM  *************************
7002  REM  DISPLAY CURRENT NAME 
7003  REM  AND ADDRESS DETAILS
7004  REM  *************************
7020  PRINT " RECORD   : "; I
7030  PRINT " NAME     : "; A$(I,1)
7040  PRINT " ADDRESS  : "; A$(I,2)
7050  PRINT " PHONE NO : "; A$(I,3)
7060  PRINT " BIRTHDAY : "; A$(I,4)
7070  PRINT "======================================="
7099  RETURN 

8000  REM 
8001  REM  *************************
8002  REM   LOAD NAME / ADDRESS DATA
8003  REM  *************************
8005  PRINT : PRINT 
8010  PRINT " READING NAME AND ADDRESS DATA ..."
8012  ONERR  GOTO 8065 : REM  CLOSE FILE
8015  PRINT D$; "OPEN ADDRESS.DATA"
8020  PRINT D$; "READ ADDRESS.DATA"
8024  REM  READ THE NUMBER OF PEOPLE IN THE ARRAY
8025  INPUT L
8026  PRINT L
8027  IF L = 0 THEN  GOTO 8060
8030  REM  NOW READ THE ARRAY DATA
8035  FOR K = 1 TO L
8040  FOR J = 1 TO 4
8045  INPUT A$(K,J)
8050  NEXT J
8055  NEXT K
8060  PRINT D$; "CLOSE ADDRESS.DATA"
8065  PRINT : PRINT " "; L; " NAMES / ADDRESS LOADED."
8099  RETURN 

9000  REM 
9001  REM  *************************
9002  REM   SAVE NAME / ADDRESS DATA
9003  REM      AND EXIT PROGRAM
9004  REM  *************************
9005  PRINT : PRINT 
9010  PRINT " SAVING NAME AND ADDRESS DATA ..."
9012  ONERR  GOTO 9060 : REM  CLOSE FILE
9015  PRINT D$; "OPEN ADDRESS.DATA"
9020  PRINT D$; "WRITE ADDRESS.DATA"
9022  REM  SAVE THE NUMBER OF PEOPLE IN THE ARRAY
9025  PRINT L
9030  REM  NOW SAVE THE ARRAY DATA
9035  FOR K = 1 TO L
9040  FOR J = 1 TO 4
9045  PRINT A$(K,J)
9050  NEXT J
9055  NEXT K
9060  PRINT D$; "CLOSE ADDRESS.DATA"
9065  PRINT : PRINT " "; L; " NAMES / ADDRESS WRITTEN."
9070  PRINT : PRINT : PRINT "      GOODBYE !! "
9999  END 
